home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / VarDeclarationStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  5.1 KB  |  145 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.LocalVariable;
  7. import sun.tools.java.Environment;
  8. import sun.tools.java.Identifier;
  9. import sun.tools.java.Type;
  10.  
  11. public class VarDeclarationStatement extends Statement {
  12.    LocalField field;
  13.    Expression expr;
  14.  
  15.    public VarDeclarationStatement(int var1, Expression var2) {
  16.       super(108, var1);
  17.       this.expr = var2;
  18.    }
  19.  
  20.    public VarDeclarationStatement(int var1, LocalField var2, Expression var3) {
  21.       super(108, var1);
  22.       this.field = var2;
  23.       this.expr = var3;
  24.    }
  25.  
  26.    long checkDeclaration(Environment var1, Context var2, long var3, int var5, Type var6, Hashtable var7) {
  27.       if (this.field != null) {
  28.          var2.declare(var1, this.field);
  29.          var3 |= 1L << this.field.number;
  30.          return this.expr != null ? this.expr.checkValue(var1, var2, var3, var7) : var3;
  31.       } else {
  32.          Expression var8 = this.expr;
  33.          if (var8.op == 1) {
  34.             this.expr = ((AssignExpression)var8).right;
  35.             var8 = ((AssignExpression)var8).left;
  36.          } else {
  37.             this.expr = null;
  38.          }
  39.  
  40.          boolean var9;
  41.          for(var9 = var6.isType(13); var8.op == 48; var6 = Type.tArray(var6)) {
  42.             ArrayAccessExpression var10 = (ArrayAccessExpression)var8;
  43.             if (var10.index != null) {
  44.                var1.error(var10.index.where, "array.dim.in.type");
  45.                var9 = true;
  46.             }
  47.  
  48.             var8 = var10.right;
  49.          }
  50.  
  51.          if (var8.op == 60) {
  52.             Identifier var13 = ((IdentifierExpression)var8).id;
  53.             if (var2.getLocalField(var13) != null) {
  54.                var1.error(super.where, "local.redefined", var13);
  55.             }
  56.  
  57.             this.field = new LocalField(var8.where, var2.field.getClassDefinition(), var5, var6, var13);
  58.             var2.declare(var1, this.field);
  59.             if (this.expr != null) {
  60.                var3 = this.expr.checkInitializer(var1, var2, var3, var6, var7);
  61.                this.expr = ((Node)this).convert(var1, var2, var6, this.expr);
  62.                var3 |= 1L << this.field.number;
  63.             } else if (var9) {
  64.                var3 |= 1L << this.field.number;
  65.             }
  66.  
  67.             return var3;
  68.          } else {
  69.             var1.error(var8.where, "invalid.decl");
  70.             return var3;
  71.          }
  72.       }
  73.    }
  74.  
  75.    public Statement inline(Environment var1, Context var2) {
  76.       if (!this.field.isUsed()) {
  77.          return (new ExpressionStatement(super.where, this.expr)).inline(var1, var2);
  78.       } else {
  79.          var2.declare(var1, this.field);
  80.          if (this.expr != null) {
  81.             this.expr = this.expr.inlineValue(var1, var2);
  82.             if (var1.optimize() && this.field.writecount == 0) {
  83.                if (this.expr.op == 60) {
  84.                   IdentifierExpression var3 = (IdentifierExpression)this.expr;
  85.                   if (var3.field.isLocal() && (var2 = var2.getInlineContext()) != null && ((LocalField)var3.field).number < var2.varNumber) {
  86.                      this.field.setValue(this.expr);
  87.                      this.field.addModifiers(16);
  88.                      this.expr = null;
  89.                      return null;
  90.                   }
  91.                }
  92.  
  93.                if (this.expr.isConstant() || this.expr.op == 82 || this.expr.op == 83) {
  94.                   this.field.setValue(this.expr);
  95.                   this.field.addModifiers(16);
  96.                   this.expr = null;
  97.                   return null;
  98.                }
  99.             }
  100.          }
  101.  
  102.          return this;
  103.       }
  104.    }
  105.  
  106.    public Statement copyInline(Context var1, boolean var2) {
  107.       VarDeclarationStatement var3 = (VarDeclarationStatement)((Node)this).clone();
  108.       if (this.expr != null) {
  109.          var3.expr = this.expr.copyInline(var1);
  110.       }
  111.  
  112.       return var3;
  113.    }
  114.  
  115.    public int costInline(int var1) {
  116.       return this.expr != null ? this.expr.costInline(var1) : 0;
  117.    }
  118.  
  119.    public void code(Environment var1, Context var2, Assembler var3) {
  120.       if (this.expr != null) {
  121.          this.expr.codeValue(var1, var2, var3);
  122.          var2.declare(var1, this.field);
  123.          var3.add(super.where, 54 + this.field.getType().getTypeCodeOffset(), new LocalVariable(this.field, this.field.number));
  124.       } else {
  125.          var2.declare(var1, this.field);
  126.       }
  127.    }
  128.  
  129.    public void print(PrintStream var1, int var2) {
  130.       var1.print("local ");
  131.       if (this.field != null) {
  132.          var1.print(this.field + "#" + this.field.hashCode());
  133.          if (this.expr != null) {
  134.             var1.print(" = ");
  135.             this.expr.print(var1);
  136.             return;
  137.          }
  138.       } else {
  139.          this.expr.print(var1);
  140.          var1.print(";");
  141.       }
  142.  
  143.    }
  144. }
  145.